#ifndef devices_H
#define devices_H

#include "user.h"
#include "my_api.h"
#include "trans_task.h"
#include "rtc_task.h"

// 二者满足其一将自动关机并不能唤醒
#define auto_power_off_low_soc 3    // 自动关机电量阈值(%)
#define auto_power_off_voltage 3200 // 自动关机电压阈值(mV)

typedef enum
{
    sys_frq_32_768k, ///< 32.8KHz
    sys_frq_38_4k,   ///< 38.4KHz
    sys_frq_4M,      ///< 4MHz
    sys_frq_8M,      ///< 8MHz
    sys_frq_16M,     ///< 16MHz
    sys_frq_22_12M,  ///< 22.12MHz
    sys_frq_24M,     ///< 24MHz
} sys_frq_t;

typedef enum
{
    wake_by_key,
    wake_by_usb,
    wake_by_alarm,
    wake_by_low_soc,
    wake_by_mems,
} sys_wake_type_t;

typedef enum
{
    wake_low_soc,
    wake_alram,
    wake_key,
    wake_usb,
    wake_wrist,
} sys_wake_info_t;

/**
 * @brief 初始化设备
 */
void devices_init(void);

/**
 * @brief 设置振动器强度,仅在ESP休眠时可用
 *
 * @param duty 0-10
 */
void devices_motor_set(uint8_t duty);

/**
 * @brief 获取USB插入状态
 * 
 * @return uint8_t 1:已插入，0：已拔出
 */
uint8_t devices_get_usb_sta(void);

/**
 * @brief 获取系统唤醒类型
 *
 * @return sys_wake_type_t
 */
sys_wake_type_t sys_get_wake_type(void);

/**
 * @brief 设置系统唤醒类型
 *
 * @param type
 */
void sys_set_wake_type(sys_wake_type_t type);

/**
 * @brief 切换系统时钟速率，切换后会自动刷新滴答定时器周期无需额外操作
 *
 * @param frq 频率枚举
 */
void sys_frq_switch(sys_frq_t frq);

/**
 * @brief 唤醒主处理器，打开通信端口
 */
void sys_wake_esp_up(void);

/**
 * @brief 获取ESP唤醒状态
 *
 * @return uint8_t 1：唤醒状态，0：休眠状态
 */
uint8_t sys_get_esp_wake_sta(void);

/**
 * @brief 上报唤醒ESP的原因到ESP
 */
void sys_upload_wake_info(void);

/**
 * @brief 进入休眠
 */
void sys_deep_sleep_start(void);

/**
 * @brief 发送复位信号（强制）到ESP通知其重启,仅在ESP唤醒期间可用
 */
void sys_restart_esp(void);

/**
 * @brief 系统重启
 */
void sys_restart(void);

/**
 * @brief 通知系统初始化流程开始
 */
void sys_init_start(void);

/**
 * @brief 通知系统初始化流程结束
 */
void sys_init_end(void);

/**
 * @brief 进入系统关机程序,震动反馈后休眠
 */
void sys_power_off(void);

/**
 * @brief 检查电量,电量低则关机
 *
 * @return uint8_t，1：低电量，0：正常
 */
uint8_t sys_chek_low_soc(void);

#endif
